/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package manager.auxiliares;

import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.util.LinkedList;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
import javax.xml.crypto.Data;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.Region;

/**
 *
 * @author Thiago
 */
public class ImprimirTabela {

    private String path = "";

    public void gerarExcel(AbstractTableModel modelo, String titulo, String textoAdicional) {
        try {
            if (path.equals("")) {
                String localArquivo = "";
                JFileChooser arquivo = new JFileChooser();
                arquivo.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

                if (arquivo.showOpenDialog(arquivo) == JFileChooser.APPROVE_OPTION) {
                    localArquivo = arquivo.getSelectedFile().getPath();
                }
                path = localArquivo;
            }
            if (!path.equals("")) {
                String nomeArquivo = "";
                Document document = new Document(PageSize.A4.rotate());
                nomeArquivo = path + "\\" + titulo + "(" + Datas.getDiaAtual() + "-" + Datas.getMesAtual() + "-" + Datas.getAnoAtual() + ")" + Datas.getHoraBanco() + ".xls";
                HSSFWorkbook wb = new HSSFWorkbook();
                HSSFSheet sheet = wb.createSheet("Planilha");
                HSSFRow row = sheet.createRow(0);
                HSSFCell cell = row.createCell((short) 0);
                cell.setCellValue(textoAdicional);
                HSSFCellStyle estilo = wb.createCellStyle();
                //Alinhando ao centro
                estilo.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                Region r = new Region(0, (short) 0, 0, (short) (modelo.getColumnCount() - 1));
                sheet.addMergedRegion(r);
                cell.setCellStyle(estilo);
                row = sheet.createRow(1);
                row.createCell((short) 0).setCellValue("Contador");
                for (int i = 1; i < modelo.getColumnCount(); i++) {
                    row.createCell((short) i).setCellValue(modelo.getColumnName(i));
                }
                for (int i = 0; i < modelo.getRowCount(); i++) {
                    row = sheet.createRow(i + 2);
                    for (int j = 0; j < modelo.getColumnCount(); j++) {
                        if (j == 0) {
                            row.createCell((short) j).setCellValue(Integer.toString(i + 1));
                        } else {
                            row.createCell((short) j).setCellValue(modelo.getValueAt(i, j).toString());
                        }
                    }
                }

                FileOutputStream stream = new FileOutputStream(nomeArquivo);
                wb.write(stream);
                File arquivo = new File(nomeArquivo);
                JOptionPane.showMessageDialog(null, "Documento gerado com sucesso.", "Gerando arquivo excel", JOptionPane.INFORMATION_MESSAGE);
            }
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Gerando arquivo excel");
        }

    }

    public void gerarPdf(AbstractTableModel modelo, String titulo, String textoAdicional) {
        try {
            if (path.equals("")) {
                String localArquivo = "";
                JFileChooser arquivo = new JFileChooser();
                arquivo.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

                if (arquivo.showOpenDialog(arquivo) == JFileChooser.APPROVE_OPTION) {
                    localArquivo = arquivo.getSelectedFile().getPath();
                }
                path = localArquivo;
            }
            if (!path.equals("")) {
                String nomeArquivo = "";
                Document document = new Document(PageSize.A4.rotate());
                nomeArquivo = path + "\\" + titulo + "(" + Datas.getDiaAtual() + "-" + Datas.getMesAtual() + "-" + Datas.getAnoAtual() + ")" + Datas.getHoraBanco() + ".pdf";
                //System.out.println(path);
                //C:\Documents and Settings\Thiago Silvano\Desktop
                PdfWriter.getInstance(document, new FileOutputStream(nomeArquivo));
                // step 3: we open the document
                document.open();

                Paragraph paragraph = new Paragraph(" "+titulo+" \n \n");
                paragraph.setAlignment(Element.ALIGN_CENTER);
                document.add(paragraph);
                document.add(new Paragraph(textoAdicional));
                document.add(new Paragraph("     "));


                PdfPTable datatable = new PdfPTable(modelo.getColumnCount());
                int headerwidths[] = new int[modelo.getColumnCount()]; // percentage
                headerwidths[0] = 8;
                int porcentagem = 92 / (modelo.getColumnCount() - 1);
                for (int i = 1; i < modelo.getColumnCount(); i++) {
                    headerwidths[i] = porcentagem;
                }
                datatable.setWidths(headerwidths);
                datatable.setWidthPercentage(100); // percentage
                datatable.getDefaultCell().setPadding(3);
                datatable.getDefaultCell().setBorderWidth(2);
                datatable.getDefaultCell().setHorizontalAlignment(
                        Element.ALIGN_CENTER);
                datatable.addCell(new Phrase("Contador", new Font(Font.TIMES_ROMAN, 11, Font.BOLD)));
                /*Teste                  */
                for (int i = 1; i < modelo.getColumnCount(); i++) {
                    datatable.addCell(new Phrase(modelo.getColumnName(i), new Font(Font.TIMES_ROMAN, 11, Font.BOLD)));
                }
                datatable.setHeaderRows(1); // this is the end of the table header
                datatable.getDefaultCell().setBorderWidth(1);
                boolean color = true;
                for (int i = 0; i < modelo.getRowCount(); i++) {
                    if (color) {
                        datatable.getDefaultCell().setGrayFill(0.9f);
                    } else {
                        datatable.getDefaultCell().setGrayFill(1);
                    }
                    color = !color;
                    for (int x = 0; x < modelo.getColumnCount(); x++) {
                        if (x == 0) {
                            datatable.addCell(new Phrase(Integer.toString(i + 1), new Font(Font.TIMES_ROMAN, 6, Font.BOLD)));
                        } else  {
                            datatable.addCell(new Phrase(modelo.getValueAt(i, x).toString(), new Font(Font.TIMES_ROMAN, 6, Font.BOLD)));
                        }
                    }
                }
                document.add(datatable);
                document.close();
                JOptionPane.showMessageDialog(null, "Documento gerado com sucesso.", "Estatísticas", JOptionPane.INFORMATION_MESSAGE);
                File pdf = new File(nomeArquivo);
                try {
                    Desktop.getDesktop().open(pdf);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    JOptionPane.showMessageDialog(null, "Erro no Desktop: " + ex);
                }
            }
        } catch (Exception de) {
            de.printStackTrace();
            JOptionPane.showMessageDialog(null, "Não foi possivel abrir o arquivo, ele pode estar sendo usado por outro programa.", "Estatísticas de Ordens de Serviço", JOptionPane.ERROR_MESSAGE);
        }
    }

    public void imprimirTabela(AbstractTableModel modelo, String titulo, String textoAdicional) {
        Object[] options = {"PDF", "Excel", "Cancelar"};
        int i = JOptionPane.showOptionDialog(null, "Escolha o tipo de arquivo que você deseja gerar.", "Gerando Arquivos", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
        if (i == 0) {
            gerarPdf(modelo, titulo, textoAdicional);
        } else if (i == 1) {
            gerarExcel(modelo, titulo, textoAdicional);
        }
    }
}
